
#ifndef DESIGN_PATTERNS_SINGLETON_SINGLETON_H
#define DESIGN_PATTERNS_SINGLETON_SINGLETON_H

#include <atomic>
#include <mutex>
#include <memory>

class Singleton;

typedef std::shared_ptr<Singleton> Sp_Singleton;

class Singleton
{
  // 私有化构造器
private:
  Singleton() = default;

  // ---------------版本1------------------- //
  // 线程不安全
private:
  static Singleton* instance_v_1_;

public:
  static Singleton* get_instance_v1();

  // ---------------版本2------------------- //
  // 智能指针+一般双检锁
  // 线程不安全
private:
  static Sp_Singleton instance_v_2_;
  static std::mutex mutex_v_2_;

public:
  static Sp_Singleton get_instance_v2();

  // ---------------版本3------------------- //
  // 使用c++11标准的std::atomic和双检锁
  // 线程安全
private:
  static std::atomic<Singleton*> instance_v_3_;
  static std::mutex mutex_v_3_;

public:
  static Singleton* get_instance_v3();

  // ---------------版本4------------------- //
  // 局部静态变量（Meyers模式）
  // 原理：
  // 如果变量在初始化的时候并发同时进入声明语句，并发线程将会阻塞等待初始化结束
  // 线程安全
public:
  static Singleton* get_instance_v4();

  // 删除拷贝构造器和赋值运算符
public:
  Singleton(const Singleton& other) = delete;
  Singleton& operator=(const Singleton& other) = delete;
};

#endif //DESIGN_PATTERNS_SINGLETON_SINGLETON_H
